package service

import (
	"gitee.com/gopher2011/mall/app/dao"
)

// 全局公开对象
var PmsProductCategory = pmsProductCategoryService{}

// 私有对象，所有的方法都绑定到这个结构体上。

type pmsProductCategoryService struct{}

func (p *pmsProductCategoryService) Create(arg dao.PmsProductCategoryParam) (int64, error) {
	arg.ProductCount = 0
	//没有父分类时为一级分类
	obj, err := p.setCategoryLevel(arg)
	if err != nil {
		dao.Error.Println("根据分类的parentId设置分类的level失败!")
	}
	res, err := dao.PmsProductCategoryDao.InsertTemplate(*obj)
	if err != nil {
		return res, err
	}
	//创建筛选属性关联
	if len(arg.AttributeIds) > 0 {
		p.insertRelationList(arg.Id, arg.AttributeIds)
	}
	return res, nil
}

func (p *pmsProductCategoryService) Delete(id int64) (int64, error) {
	return dao.PmsProductCategoryDao.DeleteTemplate(id)
}

func (p *pmsProductCategoryService) Update(id int64, arg dao.PmsProductCategoryParam) (int64, error) {
	arg.Id = id
	p.setCategoryLevel(arg)
	//更新商品分类时要更新商品中的名称
	u := dao.PmsProduct{
		ProductCategoryName: arg.Name,
	}
	res, err := dao.PmsProductDao.UpdateTemplate(u)
	if err != nil {
		return res, err
	}
	//同时更新筛选属性的信息
	if len(arg.AttributeIds) > 0 {
		_, err := dao.PmsProductCategoryAttributeRelationDao.DeleteTemplate(id)
		if err != nil {
			dao.Error.Println("更新筛选属性的信息失败!")
		}
		p.insertRelationList(id, arg.AttributeIds)
	} else {
		_, err := dao.PmsProductCategoryAttributeRelationDao.DeleteTemplate(id)
		if err != nil {
			dao.Error.Println("更新筛选属性的信息失败!")
		}
	}
	return dao.PmsProductCategoryDao.UpdateTemplate(arg)
}

// 根据分类的parentId设置分类的level
func (p *pmsProductCategoryService) setCategoryLevel(arg dao.PmsProductCategoryParam) (*dao.PmsProductCategoryParam, error) {
	//没有父分类时为一级分类
	if arg.ParentId == 0 {
		arg.Level = 0
	} else {
		//有父分类时选择根据父分类level设置
		res, err := dao.PmsProductCategoryDao.SelectTemplate(arg.ParentId) //获取arg对象的父级对象
		if err != nil {
			return nil, err
		}
		if res.Id > 0 {
			arg.Level = res.Level + 1
		} else {
			arg.Level = 0
		}
		return &arg, nil
	}
	return &arg, nil
}

// 批量插入商品分类与筛选属性关系表
// productCategoryId 商品分类id
// AttributeIds 相关商品筛选属性id集合
func (p *pmsProductCategoryService) insertRelationList(productCategoryId int64, AttributeIds []int64) (int64, error) {
	list := make([]dao.PmsProductCategoryAttributeRelation, 0)
	for _, v := range AttributeIds {
		u := dao.PmsProductCategoryAttributeRelation{
			ProductCategoryId:  productCategoryId,
			ProductAttributeId: v,
		}
		list = append(list, u)
	}
	return dao.PmsProductCategoryAttributeRelationDao.InsertTemplate(list)
}

func (p *pmsProductCategoryService) GetItem(id int64) (dao.PmsProductCategory, error) {
	return dao.PmsProductCategoryDao.SelectTemplate(id)
}

func (p *pmsProductCategoryService) List(arg dao.PmsProductCategoryList) ([]dao.PmsProductCategory, error) {
	arg.PageNum = (arg.PageNum - 1) * arg.PageSize
	return dao.PmsProductCategoryDao.List(arg)
}

func (p *pmsProductCategoryService) UpdateNavStatus(ids []int64, navStatus int32) (int64, error) {
	return dao.PmsProductCategoryDao.UpdateNavStatus(ids, navStatus)
}

func (p *pmsProductCategoryService) UpdateShowStatus(ids []int64, showStatus int32) (int64, error) {
	return dao.PmsProductCategoryDao.UpdateShowStatus(ids, showStatus)
}

func (p *pmsProductCategoryService) ListWithChildren(ids []int64, showStatus int32) (int64, error) {
	return dao.PmsProductCategoryDao.UpdateShowStatus(ids, showStatus)
}
